package io.gitee.welson.sensitive.strategy.impl;

import io.gitee.welson.sensitive.annotation.SensitiveStrategyComponent;
import io.gitee.welson.sensitive.strategy.SensitiveStrategy;
import io.gitee.welson.sensitive.util.SensitiveUtil;
import org.springframework.util.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 自定义正则脱敏策略
 * 规则：
 * 1. 通过正则表达式匹配需要脱敏的内容
 * 2. 将匹配到的内容替换为*
 * 3. 支持通过参数指定保留前后位数
 *
 * @author welson
 */
@SensitiveStrategyComponent
public class RegexSensitiveStrategy implements SensitiveStrategy {

    @Override
    public String desensitize(String value, String... params) {
        if (!StringUtils.hasText(value) || params == null || params.length < 1) {
            return value;
        }

        try {
            // 第一个参数为正则表达式
            String regex = params[0];
            // 第二个参数为保留前几位（可选）
            int keepPrefix = params.length > 1 ? Integer.parseInt(params[1]) : 0;
            // 第三个参数为保留后几位（可选）
            int keepSuffix = params.length > 2 ? Integer.parseInt(params[2]) : 0;

            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(value);
            StringBuffer result = new StringBuffer();

            while (matcher.find()) {
                String matched = matcher.group();
                String masked = SensitiveUtil.mask(matched, keepPrefix, keepSuffix);
                matcher.appendReplacement(result, Matcher.quoteReplacement(masked));
            }
            matcher.appendTail(result);

            return result.toString();
        } catch (Exception e) {
            // 如果发生异常（如正则表达式错误），返回原值
            return value;
        }
    }
}